package main

import (
	"GormData/models"
	"fmt"
	_ "github.com/go-sql-driver/mysql" // 导入 MySQL 驱动
	"github.com/jinzhu/gorm"
)

func main() {
	/*
		错误处理：
			执行SQL查询的时候，出现错误，GORM会将错误信息保存到 *gorm.DB 的Error字段， 我们只要检测Error字段就可以知道是否存在错误。
	*/

	// 用户名：密码@tcp(ip:port)/数据库?charset=utf8&parseTime=True&loc=Local
	db, err := gorm.Open("mysql", "root:123456@tcp(localhost:3306)/gorm_project?charset=utf8&parseTime=True&loc=Local")
	if err != nil {
		panic(err)
	}

	defer db.Close() // 关闭空闲的连接

	var user models.User

	// 处理单个错误
	result := db.Where("name = ? ", "zxcvz").First(&user)
	if result.Error != nil {
		// 处理错误
		fmt.Println(err)
		//panic(err)
	}

	// 处理多个错误
	// 通过GetErrors获取错误列表
	errors := db.First(&user).Limit(10).Find(&user).GetErrors()
	fmt.Println(len(errors)) // 打印错误数量

	// 遍历错误内容
	for _, err := range errors {
		fmt.Println(err)
	}

	// 错误种类
	/*
		gorm.错误类型进行判断，如gorm.ErrRecordNotFound
			1.RecordNotFound：查询不到数据，不适用于切片
			2.ErrInvalidSQL：无效sql
			3.ErrInvalidTransaction：事务有错
			4.ErrCantStartTransaction：无法开启事务，出现在使用Begin的情况下
			5.ErrUnaddressable：使用不可寻址的值，传递的指针值不对
	*/
	//gorm.IsRecordNotFoundError(err){
	//	// 没有查询到数据
	//	fmt.Println(err)
	//}

	// 事务
	// 用 db.Begin() 声明开启事务，结束的时候调用 tx.Commit()，异常的时候调用 tx.Rollback()
	//ct := db.Begin() // 开启事务
	//ret := ct.Commit()
	//
	//if ret.Error != nil {
	//	ct.Rollback() //回滚
	//}

	// 复合组件
	//type Product struct {
	//	ID    int `gorm:"primary_key"`
	//	ERPID int `gorm:"primary_key"`
	//}
}
